----------------------------------------------------------
/* IBDR 2014 – Groupe < 4x4 > */
/* Création de la procedure ps_check_reservation_location */
/* Auteur : < Fabry Jules - TA > */
/* Testeur : < NOM Prénom - Parcours > */
/* Correcteur : < NOM Prénom - Parcours > */
/* Intégrateur : < NOM Prénom - Parcours > */
----------------------------------------------------------
USE IBDR_4x4;
GO

IF OBJECT_ID ('dbo.ps_check_reservation_location', 'P') IS NOT NULL
	DROP PROCEDURE dbo.ps_check_reservation_location;
GO

CREATE PROCEDURE dbo.ps_check_reservation_location(
	@immatriculation VARCHAR(9),
	@dated DATETIME ,
	@datef DATETIME)
AS

BEGIN
	IF @immatriculation=NULL
	BEGIN
		PRINT 'Aucune immatriculation saisie !'
		RETURN 0;
	END
	IF @dated=NULL OR @dated<GETDATE()
	BEGIN
		PRINT 'Date début de location: null ou antérieure à la date d''aujourd''ui !';
		RETURN 0;
	END
	IF @datef=NULL OR @dated>=@datef
	BEGIN
		PRINT 'Date fin de location: null ou antérieure à la date début de location !';
		RETURN 0;
	END
END

IF EXISTS(
	SELECT *
	FROM Intervention
	WHERE Intervention.immatriculation = @immatriculation
	AND (Intervention.dated <= @dated AND Intervention.datef >= @dated)
	OR (Intervention.dated <= @datef AND Intervention.datef >= @datef)
)
BEGIN
	PRINT 'Location impossible car le véhicule est actuellement en intervention !'
	return 0;
END

IF NOT EXISTS(
	SELECT *
	FROM Location loc, Reservation res
	WHERE (@immatriculation LIKE loc.immatriculation
	AND ((loc.dated<=@dated AND loc.datef>=@dated)
	OR (loc.dated<=@datef AND loc.datef>=@datef))
	
	OR ((@immatriculation LIKE res.immatriculation)
	AND (res.dated<=@dated AND res.datef>=@dated)
	OR (res.dated<=@datef AND res.datef>=@datef))))
	BEGIN
		return 1;
	END
ELSE
	BEGIN
		return 2;
	END
GO




----------------------------------------------------------
/* IBDR 2014 – Groupe < 4x4 > */
/* Création de la procedure ps_insert_location */
/* Auteur : < FABRY Jules - TA > */
/* Testeur : < FABRY Jules - TA > */
/* Correcteur : < SHU Jing - FABRY Jules - TA > */
/* Intégrateur : < BOULILA Louiza - DIALLO Abdoul - TA > */
----------------------------------------------------------


IF OBJECT_ID ('dbo.ps_insert_location', 'P') IS NOT NULL
	DROP PROCEDURE dbo.ps_insert_location;

GO

CREATE PROCEDURE dbo.ps_insert_location(
	@immatriculation_FK VARCHAR(9),
	@idAbonnement_FK BIGINT,
	@dated DATETIME,
	@datef_FK DATETIME,
	@daterr_FK DATETIME,
	@etatV VARCHAR(255),
	@klmD DECIMAL(6,0),
	@klmF DECIMAL(6,0))
AS

BEGIN
	IF @immatriculation_FK=NULL OR @immatriculation_FK LIKE ''
	BEGIN
		PRINT 'saisie de l''immatriculation incorrecte';
		RETURN 0;
	END
	IF @idAbonnement_FK=NULL Or @idAbonnement_FK <= 0
	BEGIN
		PRINT 'saisie de l''idAbonnement incorrecte';
		RETURN 0;
	END
	IF @dated=NULL --OR @dated < GETDATE()
	BEGIN
		PRINT 'saisie de la date de début incorrecte';
		RETURN 0;
	END
	IF @datef_FK=NULL OR @dated>=@datef_FK
	BEGIN
		PRINT 'saisie de la date de fin incorrecte';
		RETURN 0;
	END
	IF @daterr_FK!=NULL
	BEGIN
		PRINT 'pas de saisie de la date de retour à la création';
		RETURN 0;
	END
	IF @etatV=NULL OR @etatV LIKE ''
	BEGIN
		PRINT 'oublie de la saisie de l''atat du véhicule';
		RETURN 0;
	END
	IF @klmD=NULL OR @klmD <= 0
	BEGIN
		PRINT 'saisie du kilometrage avant la location incorrecte';
		RETURN 0;
	END
	IF @klmF!=NULL
	BEGIN
		PRINT 'pas de saisie du kilometrage de retour à la création';
		RETURN 0;
	END
	DECLARE @result INT;
		
	
	DECLARE curdorReservation CURSOR FOR 
		SELECT *
		FROM Reservation
		WHERE idAbonnement=@idAbonnement_FK
		AND immatriculation=@immatriculation_FK
		AND dated=@dated;
		
	DECLARE @idAbo BIGINT;
	DECLARE @imma VARCHAR(9);
	DECLARE @datedeb DATETIME;
	DECLARE @datefin DATETIME;
	
	OPEN curdorReservation;
	FETCH curdorReservation INTO @idAbo, @imma, @datedeb, @datefin;
	
	IF @idAbo IS NULL
		BEGIN
	
		EXEC @result=ps_check_reservation_location @immatriculation_FK, @dated, @datef_FK;

		IF @result=1
		BEGIN
			IF NOT EXISTS(
				SELECT *
				FROM Vehicule v
				WHERE v.immatriculation LIKE @immatriculation_FK)
			BEGIN
				PRINT ('Le véhicule n''existe pas');
				RETURN 0;
			END
			IF EXISTS(
				SELECT *
				FROM ListeGrise lg, Abonnement ab
				WHERE ab.idAbonnement=@idAbonnement_FK
				AND lg.email=ab.emaila
				AND lg.nom=ab.noma)
			BEGIN 
				PRINT ('L''abonné est dans la liste grise !');
				RETURN 0;
			END
			IF NOT EXISTS(
					SELECT *
					FROM Abonnement ab
					WHERE ab.idAbonnement=@idAbonnement_FK)
			BEGIN
				PRINT ('Abonnement inexistant !');
				RETURN 0;
			END
		END
		ELSE
		BEGIN
			PRINT 'le véhicule est déjà réservé ou loué durant la période demandée';
			RETURN 0;
		END
		END
		ELSE
			BEGIN
				EXEC ps_suppression_reservation
					@idAbonnement_FK,
					@immatriculation_FK,
					@dated,
					@datef_FK;
			END
			
		CLOSE curdorReservation;	
		INSERT INTO Location VALUES(@immatriculation_FK, @idAbonnement_FK, @dated, @datef_FK, NULL, @etatV, @klmD, @klmF);
		
		/* faire toutes les actions supplémentaire */
		/*Creation de la facture*/
		--DECLARE @prix FLOAT
		--SELECT @prix = ModeleVehicule.prix
		--FROM  ModeleVehicule, Vehicule
		--WHERE Vehicule.immatriculation LIKE @immatriculation_FK AND
		--		Vehicule.marque LIKE ModeleVehicule.marque AND
		--		Vehicule.nbporte = ModeleVehicule.nbporte AND
		--		Vehicule.nmodel LIKE ModeleVehicule.nmodel
		--EXEC ps_insertion_facture @immatriculation_FK, @idAbonnement_FK, @dated, @prix,0.0,0.0,0.0,0.0;
		
		-- débiter le compte 
		DECLARE @NomAbonne AS VARCHAR(255);
		DECLARE @EmailAbonne AS VARCHAR(255);
		DECLARE @DateOperation DATETIME;
		DECLARE @PrixParJour FLOAT;
		DECLARE @PrixTotal FLOAT;
		DECLARE @MaxReductionGen INT;
		DECLARE @MaxReductionPerso INT;
		DECLARE @MaxReduction INT;
		SET @DateOperation = GETDATE();
		-- Retrouver le nom et le mail du détenteur de compte à partir l'id d'abonnement
		SELECT @NomAbonne = noma, @EmailAbonne = emaila FROM dbo.Abonnement WHERE dbo.Abonnement.idAbonnement = @idAbonnement_FK;	
		IF @NomAbonne = NULL OR @NomAbonne LIKE '' OR @EmailAbonne = NULL OR @EmailAbonne LIKE ''
		BEGIN
			PRINT 'Abonnement inexistant ou Nom/Email d''abonne null ou vide';
			RETURN;
		END
		
		-- Retrouver le prix par jour du véhicule concerné
		SELECT @PrixParJour = dbo.ModeleVehicule.prix
		FROM dbo.ModeleVehicule, dbo.Vehicule
		WHERE dbo.Vehicule.immatriculation = @immatriculation_FK
		AND dbo.Vehicule.marque = dbo.ModeleVehicule.marque
		AND dbo.Vehicule.nmodel = dbo.ModeleVehicule.nmodel
		AND dbo.Vehicule.nbporte = dbo.ModeleVehicule.nbporte
		IF @PrixParJour = NULL
		BEGIN
			PRINT 'l''immatriculation inexistante ou prix du modèle null';
			RETURN;
		END
		
		-- Retrouver la réduction maximum parmi les offres générales couvrant la date d'aujourd'hui
		SELECT @MaxReductionGen = MAX(dbo.Offre.reduction) 
		FROM dbo.Offre
		WHERE dbo.Offre.dated <= GETDATE() 
		AND dbo.Offre.datef >= GETDATE();
		
		
		-- Retrouver la réduction maximum parmi les offres personalisées du détenteur de compte couvrant la date d'aujourd'hui
		SELECT @MaxReductionPerso = MAX(dbo.OffrePersonnalisee.reduction) 
		FROM dbo.OffrePersonnalisee, dbo.OffresAbonnes
		WHERE dbo.OffrePersonnalisee.dated <= GETDATE() 
		AND dbo.OffrePersonnalisee.datef >= GETDATE()
		AND dbo.OffrePersonnalisee.idOffrePersonnalisee = dbo.OffresAbonnes.idOffrePersonnalisee
		AND dbo.OffresAbonnes.nom = @NomAbonne
		AND dbo.OffresAbonnes.email = @EmailAbonne;

		-- Calculer la réduction maximum final 
		IF @MaxReductionGen IS NULL OR @MaxReductionGen <= 0
		BEGIN
			IF @MaxReductionPerso IS NULL OR @MaxReductionPerso <= 0
			BEGIN SET @MaxReduction = -1; END
			ELSE
			BEGIN SET @MaxReduction = @MaxReductionPerso; END
		END
		ELSE
		BEGIN
			IF @MaxReductionPerso IS NULL OR @MaxReductionPerso <= 0
			BEGIN SET @MaxReduction = @MaxReductionGen; END
			ELSE
			BEGIN
				IF @MaxReductionGen > @MaxReductionPerso
				BEGIN SET @MaxReduction = @MaxReductionGen; END
				ELSE
				BEGIN SET @MaxReduction = @MaxReductionPerso; END
			END
		END
		
		PRINT @MaxReduction
		
		-- Calculer le montant final de l'opération
		IF @MaxReduction = -1 OR @MaxReduction=NULL
		BEGIN
			SET @PrixTotal = (CEILING(DATEDIFF(HOUR, @dated, @datef_FK)/24) * @PrixParJour)
		END
		ELSE
		BEGIN
			SET @PrixTotal = ((CEILING(DATEDIFF(HOUR, @dated, @datef_FK)/24) * @PrixParJour * (100 - @MaxReduction)) / 100);
		END
		
		-- Débiter le compte
		EXEC ps_debiter_compte @NomAbonne, @EmailAbonne, @PrixTotal;
		
		-- Créer la facture
		EXEC ps_insertion_facture @immatriculation_FK, @idAbonnement_FK, @dated, @PrixTotal, 0.0, 0.0, 0.0, 0.0;
		
		PRINT 'La location est enregistrée';
		RETURN 1;
	END
GO
----------------------------------------------------------
/* IBDR 2014 – Groupe < 4x4 > */
/* Création de la procedure ps_rendu_location */
/* Auteur : < Fabry Jules - TA > */
/* Testeur : < NOM Prénom - Parcours > */
/* Correcteur : < SHU Jing - TA > */
/* Intégrateur : < BOULILA Louiza - DIALLO Abdoul - TA > */
----------------------------------------------------------

IF OBJECT_ID ('dbo.ps_rendu_location', 'P') IS NOT NULL
	DROP PROCEDURE dbo.ps_rendu_location;

GO

CREATE PROCEDURE dbo.ps_rendu_location (
	@immatriculation_FK VARCHAR(9),
	@idAbonnement_FK BIGINT,
	@dated DATETIME,
	@daterr_FK DATETIME,
	@etatV VARCHAR(255),
	@klmF DECIMAL(6,0))
AS

BEGIN
	IF @immatriculation_FK=NULL OR @immatriculation_FK LIKE ''
	BEGIN
		PRINT 'saisie de l''immatriculation incorrecte';
		RETURN 0;
	END
	IF @idAbonnement_FK=NULL OR @idAbonnement_FK <= 0
	BEGIN
		PRINT 'saisie de l''idAbonnement incorrecte';
		RETURN 0;
	END
	IF @dated=NULL OR @dated<GETDATE()
	BEGIN
		PRINT 'saisie de la date de début incorrecte';
		RETURN 0;
	END
	IF @daterr_FK=NULL
	BEGIN
		PRINT 'pas de saisie de la date de retour à la création';
		RETURN 0;
	END
	IF @daterr_FK < @dated
	BEGIN
		PRINT 'Saisie de la date de retour est incorrecte';
		RETURN 0;
	END
	IF @etatV=NULL
	BEGIN
		PRINT 'oublie de la saisie de l''atat du véhicule';
		RETURN 0;
	END
	IF @klmF=NULL
	BEGIN
		PRINT 'pas de saisie du kilometrage de retour au rendu du véhicule';
		RETURN 0;
	END
	BEGIN
	IF EXISTS(
		SELECT *
		FROM Location
		WHERE immatriculation=@immatriculation_FK
		AND idAbonnement=@idAbonnement_FK
		AND dated=@dated)
	BEGIN
		UPDATE Location 
		SET daterr=@daterr_FK, etatV=@etatV, klmF=@klmF
		WHERE immatriculation=@immatriculation_FK
		AND idAbonnement=@idAbonnement_FK
		AND dated=@dated;
		
		/* faire toutes les actions supplémentaire */
		-- débiter le compte si en reatrd
		DECLARE @DateFinLocation DATETIME;
		SELECT @DateFinLocation = datef FROM dbo.Location
		WHERE dbo.Location.immatriculation = @immatriculation_FK
		AND dbo.Location.idAbonnement = @idAbonnement_FK
		AND dbo.Location.dated = @dated;

		-- Si la date réelle de la rendu > la date de fin prévue, c'est en reatrd
		IF @daterr_FK  > @DateFinLocation
		BEGIN
			-- Retrouver le nom et le mail du détenteur de compte à partir l'id d'abonnement
			DECLARE @NomAbonne AS VARCHAR(255);
			DECLARE @EmailAbonne AS VARCHAR(255);
			DECLARE @PrixParJour FLOAT;
			DECLARE @PrixTotal DECIMAL;
			DECLARE @DateOperation DATETIME;
			SET @DateOperation = GETDATE();
			SELECT @NomAbonne = noma, @EmailAbonne = emaila FROM dbo.Abonnement WHERE dbo.Abonnement.idAbonnement = @idAbonnement_FK;	
			IF @NomAbonne = NULL OR @NomAbonne LIKE '' OR @EmailAbonne = NULL OR @EmailAbonne LIKE ''
			BEGIN
				PRINT 'Abonnement inexistant ou Nom/Email d''abonne null ou vide';
				RETURN;
			END
			
			-- Retrouver le prix par jour du véhicule concerné
			SELECT @PrixParJour = dbo.ModeleVehicule.prix
			FROM dbo.ModeleVehicule, dbo.Vehicule
			WHERE dbo.Vehicule.immatriculation = @immatriculation_FK
			AND dbo.Vehicule.marque = dbo.ModeleVehicule.marque
			AND dbo.Vehicule.nmodel = dbo.ModeleVehicule.nmodel
			AND dbo.Vehicule.nbporte = dbo.ModeleVehicule.nbporte
			IF @PrixParJour = NULL
			BEGIN
				PRINT 'l''immatriculation inexistante ou prix du modèle null';
				RETURN;
			END
			
			-- Calculer le frais produit à cause du retard
			SET @PrixTotal = (CEILING(DATEDIFF(HOUR, @DateFinLocation, @daterr_FK)/24) * @PrixParJour)
			
			-- Débiter le compte
			EXEC ps_debiter_compte @NomAbonne, @EmailAbonne, @PrixTotal;
			
			-- On met à jour la facture
			UPDATE dbo.Facture
			SET prix = prix + @PrixTotal, cretard = cretard + @PrixTotal
			WHERE immatriculation = @immatriculation_FK
			AND idAbonnement = @idAbonnement_FK
			AND dated = @dated
		END
		DECLARE @nbVehicule INT;
		DECLARE @marque nvarchar(25);
		DECLARE @nmodel nvarchar(30);
		SELECT @nbVehicule = ModeleVehicule.nbVehicule, @marque = Vehicule.marque, @nmodel=Vehicule.nmodel
		FROM ModeleVehicule, Vehicule
		WHERE Vehicule.immatriculation LIKE @immatriculation_FK AND Vehicule.nmodel LIKE ModeleVehicule.nmodel

		IF @nbVehicule = 0
		BEGIN
			PRINT 'Le model va etre retiré de la location car le model va etre supprimé !'
			EXEC ps_suppression_modeleVehicule @marque, @nmodel, @nbVehicule   
		END
		PRINT 'la location est bien terminée';
		RETURN 1
	END
	ELSE
		PRINT 'la location n''existe pas';
	END
END
GO